package com.cskaoyan.javase.oop1._0introduction;

/**
 * @description: 对象与类
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 定义学生类
 *     分析学生类中的属性和行为，根据学生类的属性和行为来定义学生类。
 * 创建学生类对象，给属性赋值，并调用成员方法
 *
 * 1.需要创建一个学生类,怎么创建类?
 * 创建类的语法:
 *      [各种修饰符] class 类名{
 *          //类体
 *      }
 * [各种修饰符] 主要包括访问权限修饰符、final、abstract等等修饰符，修饰符完全可以全部省略，不是必须的
 * 类名： 是一个标识符，应该遵循大驼峰的命名类似Student、MyJava。起名字最好"见名知意"
 * 注意：
 *      1.一个java文件下可以允许有多个class存在，但是public class只能有一个而且类名必须和文件名保持一致
 *      2.一个java文件下，非public class和public class是同包的关系
 *      3.在正式开发中，一般来说一个Java文件下就仅有一个类，就是那个public class。大多数情况下不会有非public class
 *          但是为了上课方便，我们会在一个java文件下写多个class，方便查看代码
 *
 * 2.class Student定义完了后，怎么书写类的具体内容？
 * 类作为创建对象的模板，是抽取全体对象的共性特征得来的：
 *      ａ.通过抽取共性的"外貌特征" --> 属性
 *      b.通过抽取共性的"行为特征" --> 行为
 * 换句话说,类中描述的是对象的属性和行为的共性
 *
 * 3,类如何描述对象的属性共性?
 *      通过成员变量的形式描述对象的属性
 * 什么是成员变量?
 *      类比于局部变量,局部变量是定义在方法,代码块等局部位置的变量
 *      ---> 定义在成员位置的变量就叫做成员变量
 * 什么是成员位置?
 *      类体中,方法或者代码块等局部位置之外,称之为"成员位置"
 * 定义成员变量的语法:
 *      [各种修饰符] 数据类型 变量名;
 *    成员变量的修饰符很多,主要包括访问权限修饰符,static,final等等,修饰符是可以省略完全不写的,现在我们直接省略它们
 *
 *
 * 4,类如何描述对象的行为共性?
 *      通过成员方法的形式描述对象的行为
 * 什么是成员方法? ---> 定义在成员位置的方法
 *      在这里我们说的成员方法是属于对象的共性行为的描述,它不能加static关键字修饰
 * 定义语法:
 *      [访问权限修饰符] 返回值类型 方法名(){
 *          //方法体
 *      }
 * 注意成员方法,也叫普通成员方法,不应该用static关键字修饰
 *
 * 以上通过成员变量和成员方法就定义了一个类
 *
 * 注意事项:
 *      1.根据习惯,定义类时建议直接写成员变量,而后再写成员方法
 *      2.无论是成员变量也好,成员方法也好,如果想要访问它们,必须要创建它们的对象,否者是访问不到的
 *          成员变量和成员方法都是属于对象的,每一个对象都有自己的成员变量和成员方法
 *      3.成员变量和成员方法我们统称类的(普通)成员
 *
 * 5.如何创建对象?
 * 语法:
 *      创建对象需要在一个方法内部创建,比如main方法
 *      类名 对象名 = new 类名();
 *
 * 6.创建对象之后如何访问成员变量和成员方法?
 *      因为它们都是属于对象的,所以直接使用对象名点访问
 *
 * 需要注意的是,对象的成员变量类似于数组中的元素,它们具有默认值(默认值和数组中的元素是一样)
 *
 *
 * > 注意事项
 * - **类可以嵌套定义叫做内部类**，但是现在不要这么做，一个Java文件中定义多个class应该并列而不是包含
 * - 一个Java文件中的多个class是同包（文件夹）关系
 * - 一个类当中，应该开门见山的定义成员变量，而后再写成员方法
 * - 类中没有的属性和行为，对象是不可能有的，类是模板，模板中有才能创建出来
 *      由于继承的关系,所以Java当中的每一个类都会得到类Object中的成员
 * - 使用new关键字就会创建新的对象，两条new语句创建的对象是完全独立的
 *
 */

//Demo类作为测试类
public class Demo2 {

    //成员位置
    public static void main(String[] args) {
        //创建Student对象
        Student s = new Student();
        //获取对象中成员变量的取值
        System.out.println(s.name);
        System.out.println(s.age);
        System.out.println(s.stuId);

        //成员变量的赋值,仍然通过对象名点
        s.name = "张四";
        s.age = 18;
        s.stuId = 9527;
        System.out.println(s.name);
        System.out.println(s.age);
        System.out.println(s.stuId);
        s.study();
        s.eat();

        //直接打印Student对象名
        //com.cskaoyan.javase.oop1._0introduction.Student@1540e19d
        //@1540e19d是对象的地址值
        //com.cskaoyan.javase.oop1._0introduction.Student是全限定类名
        //在默认情况下,直接打印一个对象名会得到创建该对象的类的全限定类名,加上十六进制的地址值
        System.out.println(s);

        //new关键字一定会在堆上创建一个新的对象,它肯定是一个独立的对象
        Student s2 = new Student();
        System.out.println(s2);
        System.out.println(s == s2);

        //'com.cskaoyan.javase.oop1._0introduction.Demo2.this' cannot be referenced from a static context
        //A a = new A();
    }
    //成员位置

   //static class A{}

}

//定义学生类
class Student {

    //成员位置定义成员变量
    // 数据类型 变量名;
    //抽取学生对象的共性的属性
    String name;
    int stuId;
    int age;

    //在成员位置定义成员方法
    //学习
    public void study() {
        System.out.println("好好学习 day day up");
    }

    //吃饭
    public void eat() {
        System.out.println("好好干饭 day day up");
    }

}